import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse, InternalAxiosRequestConfig } from 'axios';

// 定义接口返回的数据结构
interface ApiResponse<T = any> {
  code: number;
  message: string;
  data: T;
}

// 定义请求配置类型
interface RequestConfig extends AxiosRequestConfig {
  // 可以扩展自定义配置
}

// 定义 HTTP 类
class HttpClient {
  private instance: AxiosInstance;

  constructor(baseURL: string) {
    this.instance = axios.create({
      baseURL,
      timeout: 10000, // 请求超时时间
    });

    // 请求拦截器
    this.instance.interceptors.request.use(
        (config: InternalAxiosRequestConfig) => {
          // 在请求发送之前做一些处理
          console.log('Request Interceptor:', config);
          // 例如：添加 token 到请求头
          const token = localStorage.getItem('token');
          if (token) {
            config.headers.Authorization = `Bearer ${token}`;
          }
          return config;
        },
        (error) => {
          // 对请求错误做一些处理
          return Promise.reject(error);
        }
    );

    // 响应拦截器
    this.instance.interceptors.response.use(
        (response: AxiosResponse<ApiResponse>) => {
          // 对响应数据做一些处理
          console.log('Response Interceptor:', response);
          if (response.data.code !== 200) {
            // 如果返回的 code 不是 200，抛出错误
            throw new Error(response.data.message || 'Request failed');
          }
          return response.data.data; // 返回实际的数据部分
        },
        (error) => {
          // 对响应错误做一些处理
          console.error('Response Error:', error);
          if (error.response) {
            // 服务器返回了错误状态码
            throw new Error(error.response.data.message || 'Request failed');
          } else if (error.request) {
            // 请求已发出，但没有收到响应
            throw new Error('No response received');
          } else {
            // 其他错误
            throw new Error(error.message || 'Request failed');
          }
        }
    );
  }

  /**
   * 发送 GET 请求
   * @param url - 请求地址
   * @param config - 请求配置
   * @returns 返回的数据
   */
  public async get<T = any>(url: string, config?: RequestConfig): Promise<T> {
    return this.instance.get(url, config);
  }

  /**
   * 发送 POST 请求
   * @param url - 请求地址
   * @param data - 请求体数据
   * @param config - 请求配置
   * @returns 返回的数据
   */
  public async post<T = any>(url: string, data?: any, config?: RequestConfig): Promise<T> {
    return this.instance.post(url, data, config);
  }

  /**
   * 发送 PUT 请求
   * @param url - 请求地址
   * @param data - 请求体数据
   * @param config - 请求配置
   * @returns 返回的数据
   */
  public async put<T = any>(url: string, data?: any, config?: RequestConfig): Promise<T> {
    return this.instance.put(url, data, config);
  }

  /**
   * 发送 DELETE 请求
   * @param url - 请求地址
   * @param config - 请求配置
   * @returns 返回的数据
   */
  public async delete<T = any>(url: string, config?: RequestConfig): Promise<T> {
    return this.instance.delete(url, config);
  }
}

// 创建全局 HTTP 实例
export const http = new HttpClient('https://api.example.com');